#include "baum.h"
#include "../TextureFunctions/texturefunctions.h"
#include "../GlobalVars/vars.h"


// Zeichne einen GLU-Cylinder mit Normalen
void Cylinder(GLdouble radiusUnten, GLdouble radiusOben,
	      GLdouble hoehe)
{
  static GLUquadricObj *quadObj=gluNewQuadric();
  gluQuadricDrawStyle(quadObj,GLU_FILL);
  gluQuadricNormals(quadObj,GLU_SMOOTH);
  // Cylinder mit nur vier Seiten weil sonst Programm zu langsam
  gluCylinder(quadObj,radiusUnten,radiusOben,hoehe,4,1);

}


// Zeichne einen Baum mit der uebergebenen Tiefe
void zeichneBaum(int tiefe)
{
  // Wenn die tiefe == 0 ist dann sind
  // wir am Ende eines Astesangekommen und zeichnen
  // einen Cylinder mit Blaettern
  if(tiefe<=0)StammMitBlaettern();
  else
    {
      Stamm(); // Male einen Stamm
      glPushMatrix();
      glTranslatef(0,1,0);
      glScalef(0.7,0.7,0.7);
      for(int i=0;i<3;i++)// jeweils drei Aester um jeweil 120 Grad gedreht
	{
	  double x=(i+1)/4.0; // versuche kleine Abweichungen einzustreuen klappt aber noch nicht
	  glPushMatrix();
	  glRotatef(i*120+x*40,0,1,0);
      	  glRotatef(30+x*20,0,0,1); // auf der Z-Achse drehen 
	  zeichneBaum(tiefe-1);     // rufe die Funktion wieder auf bis zu 0
	  glPopMatrix();
	}
      glPopMatrix();
    }
}

// Zeichne einen Stamm, dieser wird hier als Cylinder dargestellte
void Stamm()
{
  glColor3f(0.139,0.05,0.001);
  glPushMatrix();
  glRotatef(-90,1,0,0);
  Cylinder(0.1,0.08,1);
  glPopMatrix();
}

// Zeichne ein Blatt und setze den Normalvektor
void Blatt()
{
  GLfloat leaf_mat[] = { 0.0,1,0.0,1.0};
  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, leaf_mat);
  glBegin(GL_TRIANGLES);
  glNormal3f(-0.1,0,0.25);
  glVertex3f(0,0,0);
  glVertex3f(0.25,0.25,0.1);
  glVertex3f(0,0.5,0);
  glEnd();
}

// Zeichne einen Stamm mit acht Blaettern 
// evtl. Blattzahl reduzieren weil sonst zu langsam
void StammMitBlaettern()
{
   
  glPushMatrix();
  Stamm();
  glColor3f(0,1,0);
  for(int i=0;i<8;i++)
    {
      glTranslatef(0,1.0/6,0);
      glRotatef(120,0,1,0);
      glPushMatrix();
      glRotatef(50,1,0,0);
      Blatt();
      glPopMatrix();
    }
  
  glPopMatrix();
}
